package 多线程4;
//线程池ThreadPoolExecutor的参数

//在Java标准库里面,也提供了现成的线程组件.
//ThreadPoolExecutor使用相对复杂,这里面有很多的参数.

/**
 * 经典面试题:ThreadPollExecutor的构造方法都是啥意思.
 * 前两个参数:
 * corePoolSize 核心线程数
 * maximumPoolSize 最大线程数
 *
 * ThreadPoolExecutor里面包含的线程的数量并不是一成不变.
 * 能够根据任务量来自适应.
 * 如果任务比较多,就会多创建一些线程.
 * 如果任务比较少,就少创建一些线程.
 *
 * 如果我们要解决的任务场景,任务量比较稳定的.
 * 就可以设置corePoolSize和maximunPoolSize尽量接近.
 * 如果要解决的任务场景,任务量波动比较大
 * 就可以设置corePoolSize和maximumPoolSize相差更大一些.
 *
 *  既然如此,这两个值设成多少合适?
 *  和你的机器,以及要执行的任务类型,都密切相关.
 *  --> 通过实验的方式来确定比较合适.
 *
 */

/**
 * keepAliveTime,描述非核心线程数能够存在的时间?
 * unit:时间单位,也就是keepAliveTime的单位,ms,s,minute
 *
 * 性能和资源之间做权衡
 * 线程完全不销毁,相当于是性能最大化.(创建线程销毁线程的次数最少)
 * 但是吃的资源也是最大化(内存资源)
 *
 * 这个keepAliveTime时间越短,其实就是越希望吃的资源能更少
 *
 * ---------------
 * workQueue:阻塞队列,就组织了线程池要执行的任务
 *
 * threadFactory:线程创建方式
 * 通过这个参数,来设定不同的线程的创建方式
 *
 * RejectedExeutionHandLer handler:拒绝策略
 *   当任务队列满了的时候,又来新任务了,咋办?
 *   丢弃最新的任务...
 *   丢弃最老的任务...
 *   阻塞等待
 *   抛出异常
 *   ..
 *
 *   根据具体的业务场景,来选取具体的拒绝策略
 *   用来处理极端情况的
 */

//由于ThreadPoolExecutor使用起来比较复杂,
// 标准库又提供了一组其他的类,相当于又对ThredPoolExecutor进行了一层封装
/**
 *  标准库中提供了一个Executors这个类.
 *  这个类相当于一个"工厂类"
 *  通过这个类提供的一组工厂方法,就可以创建出不同风格的线程池实例了.
 *  1.newFixedThreadPool:创建出一个固定线程数量的线程池.(完全没有临时工的版本)
 *  2.newCachedThreadPool:创建出一个数量可变的线程池.(完全没有正式员工,全是临时工)
 *  3.newSingleThreadPool:创建出一个数量可变的线程池.(只是特定场景下使用)
 *  4.newScheduleThreadPool:能够设定延时时间的线程池.(插入的任务能够过一会再执行),相当于进阶版的定时器
 */

//当前我们看到了两组线程池的使用风格.
    //一个简单,一个复杂,哪个更好?
//解决简单问题,有简单解法.
//解决复杂问题,有复杂解法
//如果针对复杂问题,使用简单解法,容易引入一些坑
//如果针对简单问题,使用复杂解法,也容易使用一些坑.

public class TestDemo2 {

}
